// =====================================================================================
// 
//       Filename:  Mare.hh
// 
//    Description:  Interfaccia della Mare
// 
//         Author:  Davide Poletti , davide.pole@gmail.com
//					Paolo Pigato , p.pigato@hotmail.com	
//        Company:  P&P.cpp
// 
// =====================================================================================
#ifndef  MARE_INC
#define  MARE_INC

#include <iostream>
#include <iterator>
#include <utility>
#include <vector>
#include <iostream>
using namespace std;
#include "Casella.hh"
#include "Nave.hh"

class Mare
{
    private:
		bool _mio;
        vector< vector<Casella> > _caselle;

    public:
        Mare();

        //mare di dimensione "dim_mare", composto da caselle sotruite con "mio"
        Mare(int dim_mare, bool mio); 
        ~Mare();

        int dim_mare() const;   

        //Verifica che una coordinata sia all'interno del mare
        bool in_mare(pair<int, int> coor) const;

        //Verifica che le caselle di coor e delle vicine non abbiano navi
		bool test_casella(pair<int,int> coor) const;   

		//Verifica se sarebbe possibile inserire una nave "coor", "orient", "dim"
		bool ci_sta_nave(pair<int, int> coor, int orient, int dim) const;    

        //Inserisce la nave nel mare, collega le caselle interessate alla nave
        void inserisci_nave(Nave*);   

        //Comunica alla casella in "coor" che è stata colpita e restituisce l'esito
		int subisci_sparo(pair<int,int> coor);   

        //Ritorna le coordiante adiacenti a "coor" nella direzione "angle"
		pair<int,int> vai_successiva(pair<int,int> coor, int angle) const;

        //Ritorna il puntatore alla casella nelle coordiante "coor"
		Casella* operator[] (pair<int,int> coor) const;
		friend std::ostream& operator<<(std::ostream& os, const Mare& mare);
};
#endif // ----- #ifndef MARE_INC  -----
